/*
 * @author Guillermo Adrian Salguero Ortega
 */

package clases;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.Time;
import java.util.ArrayList;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.swing.JOptionPane;

public class Carrera implements Serializable{

  public String nombre;
  public String circuito;
  public boolean realizada;
  public SortedMap clasificacion;
  public static final int [] puntos = {25,18,15,12,10,8,6,4,2,1};

  
  public ArrayList<Piloto> pilotosAsignados;
  public ArrayList<Coche> cochesAsignados;
  private Circuito circuitoAux;
  private Integer kmCurvas;
  private Integer kmRectas;
  
    public Carrera (String nombre, String circuito){ 
     
     this.nombre = nombre;
     this.circuito = circuito;
     this.realizada = false;
     this.clasificacion = new TreeMap();
     this.kmCurvas = 0;
     this.kmRectas = 0;
     this.pilotosAsignados = new ArrayList<Piloto>();
     this.cochesAsignados = new ArrayList<Coche>();
     ArrayList<Circuito> listaCircuitos = Circuito.leerCircuito(); 
       if (!(listaCircuitos.isEmpty())){
            // Recorro la lista ocn un foreach
           for(Circuito circuitoLista : listaCircuitos) {
                // Recupero el nombre
               String nombreCirLista = circuitoLista.getNombre();
               if (this.circuito.equalsIgnoreCase(nombreCirLista)){
                   //Asigno el circuito a la variable auxiliar
                   this.circuitoAux=circuitoLista;
                   // Calculo el kilometraje de curvas y rectas
                   Integer [] curvas = this.circuitoAux.getCurvas();
                   Integer [] rectas = this.circuitoAux.getRectas();
                   for (int i=0; i< curvas.length; i++){
                        this.kmCurvas += curvas[i];
                    }
                    for (int k=0; k< rectas.length; k++){
                        this.kmRectas += rectas[k];
                    }
               }
           }
       }
       //Esta inicializacion solo es para probar la clase en teoria la rellenaran desde Director
       Piloto fAlonso = new Piloto("Fernando", "Alonso", 22, 8, 15000);
       Piloto hamiltongo = new Piloto("Lewis", "Hamilton", 50, 7, 12000);
       Piloto flamingoPink = new Piloto("Flamingo", "Pink", 50, 9, 12000);
       Piloto ronDenis = new Piloto("Ron", "Denis", 50, 1, 12000);
       Piloto koba = new Piloto("Mr", "Kobayashi", 50, 3, 12000);
       Piloto kubika = new Piloto("John", "Kubica", 50, 7, 12000);
       Piloto massa = new Piloto("Felipe", "Massa", 50, 2, 12000);
       Piloto raikonen = new Piloto("Kimmmi", "Raikonnen", 50, 7, 12000);
       Piloto senna = new Piloto("Aiton", "Senna", 50, 10, 12000);
       Piloto vettel = new Piloto("Sebastian", "Vettel", 50, 8, 12000);
       Piloto barrichelo = new Piloto("Rubens", "Barrichelo", 50, 4, 12000);
       pilotosAsignados.add(fAlonso);
       pilotosAsignados.add(hamiltongo);
       pilotosAsignados.add(flamingoPink);
       pilotosAsignados.add(ronDenis);
       pilotosAsignados.add(koba );
       pilotosAsignados.add(kubika);
       pilotosAsignados.add(massa);
       pilotosAsignados.add(raikonen);
       pilotosAsignados.add(senna);
       pilotosAsignados.add(vettel);
       pilotosAsignados.add(barrichelo);
       Coche f2014 = new Coche(150, "F2014", 800, "Softy", "Blandos",75);
       Coche mercedes14 = new Coche(200, "Mercedes 2014", 800, "Softy", "Blandos",100);
       Coche lotus14 = new Coche(100, "Lotus 2014", 800, "Softy", "Blandos",70);
       Coche redBull14 = new Coche(150, "Red Bull 2014", 800, "Softy", "Blandos",95);
       Coche williams14 = new Coche(125, "Williams 2014", 800, "Softy", "Blandos",85);
       cochesAsignados.add(f2014);
       cochesAsignados.add(mercedes14);
       cochesAsignados.add(lotus14);
       cochesAsignados.add(redBull14 );
       cochesAsignados.add(williams14);
       cochesAsignados.add(f2014);
       cochesAsignados.add(mercedes14);
       cochesAsignados.add(lotus14);
       cochesAsignados.add(redBull14 );
       cochesAsignados.add(williams14);
       cochesAsignados.add(lotus14);
     }
    
    // Getters y Setters
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getCircuito() {
        return circuito;
    }

    public void setCircuito(String circuito) {
        this.circuito = circuito;
    }
    public boolean isRealizada() {
        return realizada;
    }

    public void setRealizada(boolean realizada) {
        this.realizada = realizada;
    }
        public ArrayList<Piloto> getPilotosAsignados() {
        return pilotosAsignados;
    }

    public void setPilotosAsignados(ArrayList<Piloto> pilotosAsignados) {
        this.pilotosAsignados = pilotosAsignados;
    }

    public ArrayList<Coche> getCochesAsignados() {
        return cochesAsignados;
    }

    public void setCochesAsignados(ArrayList<Coche> cochesAsignados) {
        this.cochesAsignados = cochesAsignados;
    }
    // Fin Getters y Setters
    
    // Tiempo por vuelta
    public Time tiempo( Piloto p,  Coche c) {
        //Calculo el tiempo de cada coche en segundos
        float tiempoCurvas = (float)(this.kmCurvas.floatValue()/c.velocidadCurva.floatValue())*120;
        float tiempoRectas = (float)(this.kmRectas.floatValue()/c.velocidadRecta.floatValue())*120;
        float tiempoTotal = tiempoCurvas + tiempoRectas;
        // Los sumo y le resto la valoracion del piloto
        long tiempoVueltaSeg = (long) (tiempoTotal - (p.getValoracion()*0.1));
     
        // Lo casteo a time convirtiendo los segundos a miliseguntos
        //Time tiempoVuelta = new Time(tiempoVueltaSeg*1000);
        long segundos = tiempoVueltaSeg;
        long horas =  segundos / 3600;
        segundos -= horas*3600;
        long minutos = segundos /60;
        segundos -= minutos*60;
        Time tiempoVuelta = new Time((int)horas,(int)minutos,(int)segundos);
        // Devuelvo tiempo de la vuelta
        return tiempoVuelta;
    }
    // Calculo clasificacion de la carrera
    public void rellenarClasificacion() {
       
       int longPilotos = this.pilotosAsignados.size();
       int longCoches = this.cochesAsignados.size();
       if((longPilotos>0 && longCoches>0)){
           // Me aseguro que al recorrer las listas no haya una con mas elementos
           int index=0;
           if(longPilotos>=longCoches){index=longCoches;
           }else{index= longPilotos;}
           for(int i =0; i< index;i++){
             Piloto piloto = this.pilotosAsignados.get(i);
             Coche coche = this.cochesAsignados.get(i);
             Time tiempoVuelta = this.tiempo(piloto, coche);
             String nombreCompleto = piloto.getNombre() +" " + piloto.getApellidos();
            this.clasificacion.put(tiempoVuelta, nombreCompleto);   
           }         
           
       }else{//esta vacio el listado de coches asignados
        JOptionPane panel = new JOptionPane();
        javax.swing.JOptionPane.showMessageDialog (panel, "No hay ni coches ni pilotos seleccionados para correr la carrera");
       }
             
    }
    
    public static void escribirCarrera(Carrera carrera) {
       try {
           
           // Recupero el listado actual y le añado el nuevo
             ArrayList<Carrera> listaCarreras = Carrera.leerCarrera();
            listaCarreras.add(carrera);
            //Stream para guardar archivo
            ObjectOutputStream file = new ObjectOutputStream(new FileOutputStream("carreras.dat"));
            //Escribo el objeto en archivo
            file.writeObject(listaCarreras);
            //Cierro el archivo
            file.close();
        } catch (IOException ex) {
            System.out.println(ex);
        }
   }
    public static void escribirCarrera(ArrayList<Carrera> carreraList) {
       try {
       //Stream para guardar archivo
            ObjectOutputStream file = new ObjectOutputStream(new FileOutputStream("carreras.dat"));
            //Escribo el objeto en archivo
            file.writeObject(carreraList);
            //Cierro el archivo
            file.close();
       } catch (IOException ex) {
            System.out.println(ex);
        }
   }
    public static ArrayList<Carrera> leerCarrera(){
        ArrayList<Carrera> carreraList = new ArrayList<Carrera>();

        try {
            FileInputStream fis = new FileInputStream("carreras.dat");
            ObjectInputStream file =null;  
            while(fis.available()>0){
                file = new ObjectInputStream(fis);             
                carreraList = (ArrayList<Carrera>)file.readObject();   
            }
            //Cierro el archivo
            file.close();
            // Retorno el circuito
        } catch (ClassNotFoundException | IOException ex) {
            System.out.println(ex);
        }catch (NullPointerException ex){
            System.out.println("Exception Listado de carreras vacio");
        }
      // Devuelvo el listado de los circuitos almacenados  
      return carreraList;
      }
    
      }